package com.znfeiche.server.common;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.znfeiche.server.annotation.RequestMapping;

/**
 * 	映射处理器
 *     利用java反射读取处理器(比如HelloController)中的
 *     @RequestMapping注解中的信息，然后建立请求路径与
 *     处理器及方法的对应关系。
 *		比如说:如果请求路径是"/hello.do"，那么应该由
 *		HelloController的hello方法来处理。
 */
public class HandlerMapping {
	
	//存放请求路径与处理器及方法的对应关系。
	private Map<String,Handler> mapHandle = 
			new HashMap<String,Handler>();
	
	/**
	 * 依据请求路径，返回Handler对象。
	 * 
	 */
	public Handler getHandler(String path){
		return mapHandle.get(path);
	}
	
	/**
	 * 遍历集合(存放的是处理器实例,比如HelloController
	 * 对象),然后建立请求路径与处理器及方法的对应关系
	 */
	public void process(List beans){
		for(Object bean : beans){
			//获得class对象
			Class clazz = bean.getClass();
			//获得所有方法
			Method[] methods = 
					clazz.getDeclaredMethods();
			//遍历方法
			for(Method mh : methods){
				//获得方法前的@RequestMapping注解
				RequestMapping rm = mh.getAnnotation(
						RequestMapping.class);
				//获得@RequestMapping的属性值
				String path = rm.value();
				System.out.println("path:" + path);
				/*
				 * 存放请求路径与处理器及方法的对应关系
				 */
				mapHandle.put(path, 
						new Handler(mh,bean));
			}
		}
		
		System.out.println("mapHandle:" + mapHandle);
		
	}
	
	
	
	
}
